/*********************\
* Author:Dzlua
* QQ:505544956
* Time:2017/04/08
\**********************/
#include "LuaBase.h"

namespace DuiLib {
namespace LuaBase {

int LuaWToA(LuaState *L)
{
    LuaStack args(L);
    if (args[1].IsWString()){
        SDString str = SDConvert::WToA((LPCWSTR)args[1].GetWString());
        L->PushString(str.c_str());
    } else {
        L->PushNil();
    }
    return 1;
}

int LuaAToW(LuaState *L)
{
    LuaStack args(L);
    if (args[1].IsString()){
        SDWString str = SDConvert::AToW(args[1].GetString());
        L->PushWString((const lua_WChar*)str.c_str());
    } else {
        L->PushNil();
    }
    return 1;
}

int LuaUToW(LuaState *L)
{
    LuaStack args(L);
    if (args[1].IsString()){
        SDWString str = SDConvert::UToW(args[1].GetString());
        L->PushWString((const lua_WChar*)str.c_str());
    } else {
        L->PushNil();
    }
    return 1;
}

int LuaWToU(LuaState *L)
{
    LuaStack args(L);
    if (args[1].IsWString()){
        SDString str = SDConvert::WToU((LPCWSTR)args[1].GetWString());
        L->PushString(str.c_str());
    } else {
        L->PushNil();
    }
    return 1;
}

int LuaAToU(LuaState *L)
{
    LuaStack args(L);
    if (args[1].IsString()){
        SDString str = SDConvert::AToU(args[1].GetString());
        L->PushString(str.c_str());
    } else {
        L->PushNil();
    }
    return 1;
}

int LuaUToA(LuaState *L)
{
    LuaStack args(L);
    if (args[1].IsString()){
        SDString str = SDConvert::UToA(args[1].GetString());
        L->PushString(str.c_str());
    } else {
        L->PushNil();
    }
    return 1;
}

int LuaUToT(LuaState *L)
{
#ifdef _UNICODE
    return LuaUToW(L);
#else
    return LuaUToA(L);
#endif
}

int LuaAToT(LuaState *L)
{
#ifdef _UNICODE
    return LuaAToW(L);
#else
    LuaStack args(L);
    L->PushValue(args[1]);
    return 1;
#endif
}

int LuaWToT(LuaState *L)
{
#ifdef _UNICODE
    LuaStack args(L);
    L->PushValue(args[1]);
    return 1;
#else
    return LuaWToA(L);
#endif
}

int LuaTToU(LuaState *L)
{
#ifdef _UNICODE
    return LuaWToU(L);
#else
    return LuaAToU(L);
#endif
}

int LuaTToA(LuaState *L)
{
#ifdef _UNICODE
    return LuaWToA(L);
#else
    LuaStack args(L);
    L->PushValue(args[1]);
    return 1;
#endif
}

int LuaTToW(LuaState *L)
{
#ifdef _UNICODE
    LuaStack args(L);
    L->PushValue(args[1]);
    return 1;
#else
    return LuaAToW(L);
#endif
}

void RegisterConvert(LuaState* L)
{
    LuaObject conv = L->GetGlobals();
    conv.Register("WToA", LuaWToA);
    conv.Register("AToW", LuaAToW);
    conv.Register("UToW", LuaUToW);
    conv.Register("WToU", LuaWToU);
    conv.Register("AToU", LuaAToU);
    conv.Register("UToA", LuaUToA);
    conv.Register("UToT", LuaUToT);
    conv.Register("AToT", LuaAToT);
    conv.Register("WToT", LuaWToT);
    conv.Register("TToU", LuaTToU);
    conv.Register("TToA", LuaTToA);
    conv.Register("TToW", LuaTToW);
    conv.Register("S", LuaUToA);
    conv.Register("L", LuaUToW);
    conv.Register("T", LuaUToT);
}

void UnRegisterConvert(LuaState* L)
{
    LuaObject conv = L->GetGlobals();
    conv.SetNil("WToA");
    conv.SetNil("AToW");
    conv.SetNil("UToW");
    conv.SetNil("WToU");
    conv.SetNil("AToU");
    conv.SetNil("UToA");
    conv.SetNil("UToT");
    conv.SetNil("AToT");
    conv.SetNil("WToT");
    conv.SetNil("TToU");
    conv.SetNil("TToA");
    conv.SetNil("TToW");
    conv.SetNil("S");
    conv.SetNil("L");
    conv.SetNil("T");
}

}
}